// 题意: 给定一个双臂天平，m个挂钩位置（-15..15），n个砝码重量(1..25)，砝码
//       重量都不同，n，m都是小于等于20。砝码可以任意放（可以叠加）。问最后
//       使天平平衡的方法数。
//
// 题解：留意到砝码可以任意放（就是可以叠加），那这道题就水了，一个背包就行。
//
// 统计：272ms，24min，2WA(long long)
//
// run: $exec < input
#include <iostream>

int const maxn = 30;
int const dis = 5000;
long long dp[maxn][3 * dis];
int pos[maxn], weight[maxn];
int n, m;

int main()
{
	std::cin >> m >> n;
	for (int i = 1; i <= m; i++) std::cin >> pos[i];
	for (int i = 1; i <= n; i++) std::cin >> weight[i];

	dp[0][dis] = 1;
	for (int i = 1; i <= n; i++ ) {
		for (int j = -dis; j <= dis; j++) {
			for (int k = 1; k <= m; k++) {
				int tmp = pos[k] * weight[i];
				if (j - tmp + dis < 0 || j - tmp + dis >= 3 * dis) continue;
				dp[i][j + dis] += dp[i - 1][j - tmp + dis];
			}
		}
	}
	std::cout << dp[n][dis] << '\n';
}

